print("锁##################################################start")
import time, threading

# 假定这是你的银行存款:
balance = 0
lock = threading.Lock()


def change_it(n):
    # 先存后取，结果应该为0:
    global balance
    balance = balance + n
    balance = balance - n


def run_thread(n):
    for i in range(100000):
        lock.acquire()  # 先要获取锁
        try:
            change_it(n)
        finally:
            lock.release()  # 改完了一定要释放锁


# 获得锁的线程用完后一定要释放锁，否则那些苦苦等待锁的线程将永远等待下去，
# 成为死线程。所以我们用try...finally来确保锁一定会被释放。

t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)
# 当某个线程开始执行change_it()时，我们说，该线程因为获得了锁，
# 因此其他线程不能同时执行change_it()，只能等待，直到锁被释放后，
# 获得该锁以后才能改。由于锁只有一个，无论多少线程，
# 同一时刻最多只有一个线程持有该锁，所以，不会造成修改的冲突。

# 需要注意的是python线程不能利用多cpu 只有进程可以
print("锁##################################################end\n")
